<?php
class ResultsController extends AppController {

	var $name = 'Results';
	var $uses = array('Result','PeoplePractice','Person','Practice','Combo','CombosPractice');

    function beforeFilter () {
        parent::beforeFilter();

		// Aplico el Layout segun la Vista o si es AJAX
		if ($this->RequestHandler->isAjax()) {
			$this->layout = 'ajax';
		}else{
			// Cambio la Vista por la del Rol
			$this->layout = strtolower($this->Session->read('VistaActual'));
		}
    }
    
	function index($id_paciente = null, $archivados = null) {
		$this->Result->recursive = 1;

		if(!$archivados){
			$results = $this->Result->find('all', array(
							'conditions' => array(
												'Result.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
												'Result.person_id' => $id_paciente,
												'NOT' => array ('Result.staterecord_id' => array('2','3'))
											),
							'order' => array('Result.fecha_solicitud DESC', 'Practice.name'),
							'fields' => array('Result.id', 'Result.fecha_solicitud', 'Result.person_id', 'Practice.name','Result.conclusion','Result.valor','Practice.id')

			) );
		}else{ // Para mostrar tambien los registros ARCHIVADOS
			$results = $this->Result->find('all', array(
							'conditions' => array(
												'Result.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
												'Result.person_id' => $id_paciente,
												'NOT' => array ('Result.staterecord_id' => array('2'))
											),
							'order' => array('Result.fecha_solicitud DESC', 'Practice.name'),
							'fields' => array('Result.id', 'Result.fecha_solicitud', 'Result.person_id', 'Practice.name','Result.conclusion','Result.valor','Practice.id')
			) );
		}

		$this->set('archivados', $archivados);
		$this->set('results', $results);
		$this->set('id_paciente', $id_paciente);
		$this->layout = 'ajax';
	}

	function view($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid result', true));
			$this->redirect(array('action' => 'index'));
		}
		$this->set('result', $this->Result->read(null, $id));
	}

	function add($id_paciente = null, $id_practica = null) {
		if (!empty($this->data)) {

			// Si no se selecciono ninguna Práctica
			if(empty($this->data['PeoplePractice']['arregloPracticasSeleccionadas']) AND empty($this->data['Result']['arregloCombosSeleccionados'])){
				$this->Session->setFlash(__('Debe seleccionar al menos una  Práctica', true));
				$this->redirect('/people/view/'.$this->data['Result']['person_id'].'/6');
				exit;
			}

			// Defino la Fecha para todos los Resultados de las Practicas
			$fecha_resultado_practica = date("Y-m-d H:i:s");

			// Cargo todas las practicas asociadas
			if(!empty($this->data['PeoplePractice']['arregloPracticasSeleccionadas'])){

				foreach($this->data['PeoplePractice']['arregloPracticasSeleccionadas'] AS $indice => $id_practica_seleccionada){


					// Si la Practica seleccionada no existe, la cargo
					if($this->requestAction('/PeoplePractices/existePractica/'.$this->data['Result']['person_id'].'/'.$id_practica_seleccionada) == "0"){

						$this->PeoplePractice->create();

						// Seteo datos que no vienen del Formulario
						$this->PeoplePractice->set(array(
							'person_id' => $this->data['Result']['person_id'],
							'practice_id' => $id_practica_seleccionada,
							'fecha' => $this->data['Result']['fecha_solicitud'],
							'client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
							'user_id' => $this->Auth->user('id'),
						));

						// Grabo cada Practica al Paciente
						$this->PeoplePractice->save();
					}

					$this->Result->create();

					/*==============================================================================*/
					/* Subo el Archivo asociado a la Practica si se cargo y es válido				*/
					/*==============================================================================*/
						$nombre_archivo = "";
						$mensaje_error = "";

						if(isset($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['name']) AND !empty($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['name'])){
							if ($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['size'] < 2048000){
								if ($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['size'] != 0){

									if($this->archivo_permitido($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['type'])){
										$nombre_archivo = md5($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['name'].$this->data['Result']['person_id'].$this->Auth->user('id')).".".$this->obtenerExtension($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['name']);
										$success = move_uploaded_file($this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['tmp_name'] ,"files/".$nombre_archivo);

										if(!$success){
											$mensaje_error .= " La imagen ".$this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['name']." no pudo ser subida.";
										}

									}else{
										$mensaje_error .= " La imagen ".$this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['name']." no tiene un formato de imágen válido.";
									}
								}
							}else {
								$mensaje_error .= " La imagen ".$this->data['PeoplePractice']['arregloAdjuntosSeleccionadas'][$indice]['name']." supera los 2mb.";	
							}
						}

					/*==============================================================================*/

					// Seteo datos que no vienen del Formulario
					$this->Result->set(array(
						'client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
						'person_id' => $this->data['Result']['person_id'],
						'user_id' => $this->Auth->user('id'),
						'practice_id' => $id_practica_seleccionada,
						'fecha_solicitud' => $fecha_resultado_practica,
						'archivo' => $nombre_archivo,
						'staterecord_id' => '1',
						'conclusion' => $this->data['PeoplePractice']['arregloConclusionesPracticasSeleccionadas'][$indice]
					));

					// Grabo cada Resultado
					$this->Result->save($this->data);

				}
			}

			// Cargo todas las practicas asociadas a los COMBOS
			if(!empty($this->data['Result']['arregloCombosSeleccionados'])){
				foreach($this->data['Result']['arregloCombosSeleccionados'] AS $indice_combo => $id_practica_combo_seleccionada){

					$arreglo_practica_combo_seleccionada = explode("|", $id_practica_combo_seleccionada); 

					foreach($arreglo_practica_combo_seleccionada AS $id_practica_combo){

						// Si la Practica seleccionada no existe y el ID no esta vacio, la cargo
						if($this->requestAction('/PeoplePractices/existePractica/'.$this->data['Result']['person_id'].'/'.$id_practica_combo) == "0" AND !empty($id_practica_combo)){

							// Creo un Registro
							$this->PeoplePractice->create();

							// Seteo datos que no vienen del Formulario
							$this->PeoplePractice->set(array(
								'client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
								'user_id' => $this->Auth->user('id'),
								'practice_id' => $id_practica_combo,
								'person_id' => $this->data['Result']['person_id'],
								'fecha' => $this->data['Result']['fecha'],
							));

							// Grabo cada Practica
							$this->PeoplePractice->save();
						}


						if(!empty($id_practica_combo)){

							$this->Result->create();

							// Seteo datos que no vienen del Formulario
							$this->Result->set(array(
								'client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
								'user_id' => $this->Auth->user('id'),
								'practice_id' => $id_practica_combo,
								'fecha_solicitud' => $fecha_resultado_practica,
								'conclusion' => $this->data['PeoplePractice']['arregloConclusionesCombosSeleccionadas'][$indice_combo],
							));

							// Grabo cada Resultado
							$this->Result->save($this->data);
						}

					} // FIN foreach COMBOS
				}
			}

			$this->Session->setFlash(__('El Resultado ha sido cargado.'.$mensaje_error, true));
			$this->redirect('/people/view/'.$this->data['Result']['person_id'].'/6');
			exit;
		}

		if (!$id_paciente) {
			exit;
		}

		$people = $this->Person->find('list', array(
						'conditions' => array('Person.id' => $id_paciente),
						'fields' => array('Person.id', 'Person.full_name')
		) );

		$practicaspaciente = $this->Person->query(
			"SELECT 
				Practice.name, Practice.id
			FROM 
				people_practices AS PeoplePractice 
				INNER JOIN practices AS Practice ON Practice.id = PeoplePractice.practice_id
			WHERE
				PeoplePractice.person_id =  '$id_paciente' AND 
				PeoplePractice.client_id = '".$this->Session->read('ClientesUsuarioLogueado.id')."' AND 
				NOT PeoplePractice.staterecord_id IN ('2','3')
			GROUP BY 
				Practice.id
			ORDER BY 
				Practice.name
			"
		);

		$combos = $this->Combo->find('all', array(
						'conditions' => array(
											'Combo.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
											'Combo.user_id' => $this->Session->read('ProfesionalSeleccionado'),
										),
						'fields' => array('Combo.id', 'Combo.name')
		) );

		$this->set('id_paciente', $id_paciente);
		$this->set(compact('people', 'combos','practicaspaciente'));
	}

	function edit($id = null) {
		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Invalid result', true));
			$this->redirect(array('action' => 'index'));
		}
		if (!empty($this->data)) {
			if ($this->Result->save($this->data)) {
				$this->Session->setFlash(__('The result has been saved', true));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('The result could not be saved. Please, try again.', true));
			}
		}
		if (empty($this->data)) {
			$this->data = $this->Result->read(null, $id);
		}
		$practices = $this->Result->Practice->find('list');
		$this->set(compact('practices'));
	}

	function archivar($id = null, $id_paciente = null, $estado = null) {
		if (!$id) {
			$this->Session->setFlash(__('Resultado no valido', true));
			$this->redirect('/dashboards');
		}

		if (!$id_paciente) {
			$this->Session->setFlash(__('Paciente no valido', true));
			$this->redirect('/dashboards');
		}

		if (!$estado) {
			$this->Session->setFlash(__('Estado no valido', true));
			$this->redirect('/dashboards');
		}

		$this->Result->id = $id;
		$this->Result->set(array(
			'staterecord_id' =>  $estado,
			'user_id' => $this->Auth->user('id'),
		));

		if ($this->Result->save()) {
			$this->Session->setFlash(__('El Resultado fue procesado.', true));
			$this->redirect('/people/view/'.$id_paciente.'/6');
		}
		$this->Session->setFlash(__('El Resultado no pudo ser procesado', true));
		$this->redirect('/people/view/'.$id_paciente.'/6');
	}

	function archivo_permitido($formato_archivo){

		// list of permitted file types, this is only images but documents can be added  
		$permitted = array('image/gif','image/jpeg','image/pjpeg','image/png');  

		if(in_array($formato_archivo, $permitted)){
			return true;
		}else{
			return false;
		}
	}

	function obtenerExtension($nombre_archivo){

		$posicion_punto = strrpos($nombre_archivo,".");

		if(!$posicion_punto == FALSE){
			return substr($nombre_archivo, 1 + $posicion_punto);
		}else{
			return 0;
		}
	}

}
?>